package com.example.myandroidapp.kotlin

/*
* 类的定义：初始化顺序：主构造 → init 块 → 次构造体
* 1：类的实例化不用new了，直接 类名()
* 2：主构造函数:
*   1：类后面 接constructor 关键字(若没有注解或可见性修饰符，可省略 constructor 关键字)
*   2：init 实例化时会执行：通常做一些初始化或检验操作
* 3：次构造函数
*
*/
fun main() {
    var dog = Dog()
    println(dog.name + dog.age)
    dog.eat("骨头")

    var cat = Cat("小猫", 2)
    cat.eat()

    var person = Person("张三")
    person.intro()
    var person2 = Person("张三", 18, 90)
    person2.intro()
}

//基本的类定义
class Dog {
    var name: String = "旺财"
    var age: Int = 1

    fun eat(food: String) {
        println("吃吃吃$food")
    }
}

/*
* 主构造函数定义及用法：
* 1：类后面 接constructor 关键字(若没有注解或可见性修饰符，可省略 constructor 关键字)
* 2：init 实例化时会执行：通常做一些初始化或检验操作
*
*/
class Cat constructor(var name: String, var age: Int) {

    init {
        // 初始化的验证
        println("初始化")
        require(name.isNotEmpty()) { "姓名不能为空" }
        require(age > 0) { "年龄不能小于0" }
    }

    fun eat() {
        println(name + "喝西北风")
    }
}

/*
* 次构造函数定义及用法：在类中定义的
* 1：通常用于支持不同的参数组合或特殊初始化场景。
* 2：直接constructor 关键字定义,: this(name) 回调主构造函数
*/
class Person constructor(var name: String) {
    var age: Int = 0
    var score: Int = 0

    init {
        // 初始化的验证
        println("初始化")
        require(name.isNotEmpty()) { "姓名不能为空" }
    }

    // 次构造函数1
    constructor(name: String, age: Int) : this(name) {
        this.age = age
    }

    // 次构造函数2
    constructor(name: String, age: Int, score: Int) : this(name, age) {
        this.score = score
    }

    fun intro() {
        println("我的名字叫：$name ,我的年龄是：$age, 成绩是: $score ")
    }
}